package com.example.rabbitmq.simple;

import com.rabbitmq.client.*;

import java.io.IOException;

public class MyConsumer extends DefaultConsumer {
    private Channel channel ;

    public MyConsumer(Channel channel) {
        super(channel);
        this.channel=channel;
    }

     // 获取消息，并且处理，这个方法类似事件监听，如果有消息的时候，会被自动调用
    @Override
    public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
                               byte[] body) throws IOException {
        try {
            // body 即消息体
            String msg = new String(body);
//                    System.out.println(1/0); // 模拟异常  表示消息未正常处理    网络波动。。
            System.out.println(" [x] received : " + msg + "!"+"  envelope.getDeliveryTag()"+envelope.getDeliveryTag());
            Thread.sleep(120);
            //   false   不按照批量删除 来清理队列信息     true  按照批量删除
            channel.basicAck(envelope.getDeliveryTag(),false);//   手动通知队列 删除消息即可 一般在手动确认ack机制使用
        } catch (Exception e){
            e.printStackTrace();  //  第三个参数  false  直接删除消息   true  表示 ：把消息重回队列
            channel.basicNack(envelope.getDeliveryTag(),false,true);
        }
    }
}
